home *** CD-ROM | disk | FTP | other *** search
/ Practical Internet 2002 February / Practical Internet February 2002.iso / pc / Software / Browsing / httrack-3.09e2.exe / {app} / src_win / WinHTTrack / newlang.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-11-01  |  11.2 KB  |  435 lines

  1.  
  2. // Win includes
  3. #include "stdafx.h"
  4. #include "Shell.h"
  5.  
  6. // Hash for lang.h
  7. extern "C" {
  8.   #include "htshash.h"
  9. };
  10. #include "newlang.h"
  11.  
  12. int NewLangStrSz=1024;
  13. inthash NewLangStr=NULL;
  14. int NewLangStrKeysSz=1024;
  15. inthash NewLangStrKeys=NULL;
  16.  
  17.  
  18. void LANG_LOAD(char* limit_to) {
  19.   CWaitCursor wait;
  20.   //
  21.   extern int NewLangStrSz;
  22.   extern inthash NewLangStr;
  23.   extern int NewLangStrKeysSz;
  24.   extern inthash NewLangStrKeys;
  25.   //
  26.   int selected_lang=LANG_T(-1);
  27.   //
  28.   if (!limit_to) {
  29.     LANG_DELETE();
  30.     NewLangStr=inthash_new(NewLangStrSz);
  31.     NewLangStrKeys=inthash_new(NewLangStrKeysSz);
  32.     if ((NewLangStr==NULL) || (NewLangStrKeys==NULL)) {
  33.       AfxMessageBox("Error in lang.h: not enough memory");
  34.     } else {
  35.       inthash_value_is_malloc(NewLangStr,1);
  36.       inthash_value_is_malloc(NewLangStrKeys,1);
  37.     }
  38.   }
  39.  
  40.   CString app;
  41.   CWinApp* pApp = AfxGetApp();
  42.   if (pApp) {
  43.     app=pApp->m_pszHelpFilePath;
  44.     app=app.Left(app.ReverseFind('\\')+1);
  45.   }
  46.  
  47.   /* Load master file (list of keys and internal keys) */
  48.   if (!limit_to) {
  49.     CString mname=app+"lang.def";
  50.     if (!fexist((char*)LPCTSTR(mname)))
  51.       mname="lang.def";
  52.     FILE* fp=fopen(mname,"rb");
  53.     if (fp) {
  54.       char intkey[8192];
  55.       char key[8192];
  56.       while(!feof(fp)) {
  57.         linput_cpp(fp,intkey,8000);
  58.         linput_cpp(fp,key,8000);
  59.         if (strnotempty(intkey) && strnotempty(key)) {
  60.           char* test=LANGINTKEY(key);
  61.  
  62.           /* Increment for multiple definitions */
  63.           if (strnotempty(test)) {
  64.             int increment=0;
  65.             int pos=strlen(key);
  66.             do {
  67.               increment++;
  68.               sprintf(key+pos,"%d",increment);
  69.               test=LANGINTKEY(key);
  70.             }  while (strnotempty(test));
  71.           }
  72.  
  73.           if (!strnotempty(test)) {         // Θviter doublons
  74.             // conv_printf(key,key);
  75.             int len;
  76.             char* buff;
  77.             len=strlen(intkey);
  78.             buff=(char*)malloc(len+2);
  79.             if (buff) {
  80.               strcpy(buff,intkey);
  81.               inthash_add(NewLangStrKeys,key,(long int)(char*)buff);
  82.             }
  83.           }
  84.         } // if
  85.       }  // while
  86.       fclose(fp);
  87.     } else {
  88.       AfxMessageBox("FATAL ERROR\r\n'lang.def' file NOT FOUND!\r\nEnsure that the installation was complete!");
  89.       exit(0);
  90.     }
  91.   }
  92.   
  93.   /* Language Name? */
  94.   char* hashname;
  95.   {
  96.     char name[256];
  97.     sprintf(name,"LANGUAGE_%d",selected_lang+1);
  98.     hashname=LANGINTKEY(name);
  99.   }
  100.  
  101.   /* Get only language name */
  102.   if (limit_to) {
  103.     if (hashname)
  104.       strcpy(limit_to,hashname);
  105.     else
  106.       strcpy(limit_to,"???");
  107.     return;
  108.   }
  109.  
  110.   /* Error */
  111.   if (!hashname)
  112.     return;
  113.   
  114.   /* Load specific language file */
  115.   {
  116.     int loops;
  117.     CString err_msg="";
  118.     // 2nd loop: load undefined strings
  119.     for(loops=0;loops<2;loops++) {
  120.       CString lbasename;
  121.       
  122.       {
  123.         char name[256];
  124.         sprintf(name,"LANGUAGE_%d",(loops==0)?(selected_lang+1):1);
  125.         hashname=LANGINTKEY(name);
  126.       }
  127.       lbasename.Format("lang/%s.txt",hashname);
  128.       CString lname=app+lbasename;
  129.       if (!fexist((char*)LPCTSTR(lname)))
  130.         lname=lbasename;
  131.       FILE* fp=fopen(lname,"rb");
  132.       if (fp) {
  133.         char extkey[8192];
  134.         char value[8192];
  135.         while(!feof(fp)) {
  136.           linput_cpp(fp,extkey,8000);
  137.           linput_cpp(fp,value,8000);
  138.           if (strnotempty(extkey) && strnotempty(value)) {
  139.             int len;
  140.             char* buff;
  141.             char* intkey;
  142.             
  143.             intkey=LANGINTKEY(extkey);
  144.             
  145.             if (strnotempty(intkey)) {
  146.               
  147.               /* Increment for multiple definitions */
  148.               {
  149.                 char* test=LANGSEL(intkey);
  150.                 if (strnotempty(test)) {
  151.                   if (loops == 0) {
  152.                     int increment=0;
  153.                     int pos=strlen(extkey);
  154.                     do {
  155.                       increment++;
  156.                       sprintf(extkey+pos,"%d",increment);
  157.                       intkey=LANGINTKEY(extkey);
  158.                       if (strnotempty(intkey))
  159.                         test=LANGSEL(intkey);
  160.                       else
  161.                         test="";
  162.                     }  while (strnotempty(test));
  163.                   } else
  164.                     intkey="";
  165.                 } else {
  166.                   if (loops > 0) {
  167.                     err_msg += intkey;
  168.                     err_msg += " ";
  169.                   }
  170.                 }
  171.               }
  172.               
  173.               /* Add key */
  174.               if (strnotempty(intkey)) {
  175.                 len=strlen(value);
  176.                 buff=(char*)malloc(len+2);
  177.                 if (buff) {
  178.                   conv_printf(value,buff);
  179.                   inthash_add(NewLangStr,intkey,(long int)(char*)buff);
  180.                 }
  181.               }
  182.               
  183.             }
  184.           } // if
  185.         }  // while
  186.         fclose(fp);
  187.       } else {
  188.         AfxMessageBox("FATAL ERROR\r\n'lang.def' file NOT FOUND!\r\nEnsure that the installation was complete!");
  189.         exit(0);
  190.       }
  191.     }
  192.     if (err_msg.GetLength()>0) {
  193.       // AfxMessageBox("Error: undefined strings follows:\r\n"+err_msg);
  194.     }
  195.   }
  196.  
  197.  
  198.  
  199. #if 0
  200.   app=app+"lang.h";
  201.   if (!fexist((char*)LPCTSTR(app)))
  202.     app="lang.h";
  203.   
  204.   FILE* fp=fopen(app,"rb");
  205.   if (fp) {
  206.     char s[8192];
  207.     while(!feof(fp)) {
  208.       linput_cpp(fp,s,8000);
  209.       if (!strncmp(s,"#define ",8)) {
  210.         char* a;
  211.         char* name=s+8;
  212.         a=name;
  213.         while((*a!=' ') && (*a)) a++;
  214.         if ((*a) && (strlen(name)>0) && (((int) a - (int) name)<64)) {
  215.           *a++='\0';
  216.           if (limit_to) {
  217.             if (strcmp(name,limit_to))
  218.               a=NULL;
  219.           }
  220.           if (a) {
  221.             char* data;
  222.             data=a;
  223.             int toggle=0;
  224.             char* start_str=NULL;
  225.             int count=0;
  226.             while(*a) {
  227.               if (*a=='\"') {
  228.                 toggle++;
  229.                 if ((toggle%2)==1) {
  230.                   if (count==selected_lang) {
  231.                     start_str=a+1;
  232.                   }
  233.                   count++;
  234.                 } else {
  235.                   if (start_str) {
  236.                     char* buff;
  237.                     int len;
  238.                     len=(int) a - (int) start_str;
  239.                     if (len) {
  240.                       buff=(char*)malloc(len+2);
  241.                       if (buff) {
  242.                         int i=0,j=0;
  243.                         buff[0]='\0';
  244.                         //strncat(buff,start_str,len);
  245.                         while(i<len) {
  246.                           switch(start_str[i]) {
  247.                           case '\\': 
  248.                             i++;
  249.                             switch(start_str[i]) {
  250.                             case 'a': buff[j]='\a'; break;
  251.                             case 'b': buff[j]='\b'; break;
  252.                             case 'f': buff[j]='\f'; break;
  253.                             case 'n': buff[j]='\n'; break;
  254.                             case 'r': buff[j]='\r'; break;
  255.                             case 't': buff[j]='\t'; break;
  256.                             case 'v': buff[j]='\v'; break;
  257.                             case '\'': buff[j]='\''; break;
  258.                             case '\"': buff[j]='\"'; break;
  259.                             case '\\': buff[j]='\\'; break;
  260.                             case '?': buff[j]='\?'; break;
  261.                             default: buff[j]=start_str[i]; break;
  262.                             }
  263.                             break;
  264.                             default: 
  265.                               buff[j]=start_str[i]; 
  266.                               break;
  267.                           }
  268.                           i++;
  269.                           j++;
  270.                         }
  271.                         buff[j++]='\0';
  272.                         if (!limit_to)
  273.                           inthash_add(NewLangStr,name,(long int)(char*)buff);
  274.                         else {
  275.                           strcpy(limit_to,buff);
  276.                           free(buff);
  277.                           return;
  278.                         }
  279.                       }
  280.                     }
  281.                     start_str=NULL;
  282.                   }
  283.                 }
  284.               }
  285.               a++;
  286.             }
  287.           }
  288.           
  289.           //NewLangStr.SetAt(sname,st);
  290.           /*
  291.           } else {
  292.           CString info;
  293.           info.Format("Error in lang.h: %s",name);
  294.           AfxMessageBox(info);
  295.         */
  296.         }
  297.       }
  298.     }
  299.  
  300.  
  301.     fclose(fp);
  302.  
  303.   } else {
  304.     AfxMessageBox("FATAL ERROR\r\n'lang.h' file NOT FOUND!\r\nEnsure that the installation was complete!");
  305.     exit(0);
  306.   }
  307. #endif
  308.  
  309.   // Control limit_to
  310.   if (limit_to)
  311.     limit_to[0]='\0';
  312. }
  313.  
  314. void conv_printf(char* from,char* to) {
  315.   int i=0,j=0,len;
  316.   len=strlen(from);
  317.   while(i<len) {
  318.     switch(from[i]) {
  319.     case '\\': 
  320.       i++;
  321.       switch(from[i]) {
  322.       case 'a': to[j]='\a'; break;
  323.       case 'b': to[j]='\b'; break;
  324.       case 'f': to[j]='\f'; break;
  325.       case 'n': to[j]='\n'; break;
  326.       case 'r': to[j]='\r'; break;
  327.       case 't': to[j]='\t'; break;
  328.       case 'v': to[j]='\v'; break;
  329.       case '\'': to[j]='\''; break;
  330.       case '\"': to[j]='\"'; break;
  331.       case '\\': to[j]='\\'; break;
  332.       case '?': to[j]='\?'; break;
  333.       default: to[j]=from[i]; break;
  334.       }
  335.       break;
  336.       default: 
  337.         to[j]=from[i]; 
  338.         break;
  339.     }
  340.     i++;
  341.     j++;
  342.   }
  343.   to[j++]='\0';
  344. }
  345.  
  346. void LANG_DELETE() {
  347.   extern int NewLangStrSz;
  348.   extern inthash NewLangStr;
  349.   extern int NewLangStrKeysSz;
  350.   extern inthash NewLangStrKeys;
  351.   //
  352.   inthash_delete(&NewLangStr);
  353.   inthash_delete(&NewLangStrKeys);
  354. }
  355.  
  356. // sΘlection de la langue
  357. void LANG_INIT() {
  358.   CWinApp* pApp = AfxGetApp();
  359.   if (pApp) {
  360.     int test = pApp->GetProfileInt("Language","IntId",0);
  361.     LANG_T(pApp->GetProfileInt("Language","IntId",0));
  362.   }
  363. }
  364.  
  365. int LANG_T(int l) {
  366.   if (l>=0) {
  367.     QLANG_T(l);
  368.     CWinApp* pApp = AfxGetApp();
  369.     if (pApp)
  370.       pApp->WriteProfileInt("Language","IntId",l);
  371.     LANG_LOAD(NULL);
  372.   }
  373.   return QLANG_T(-1);  // 0=default (english)
  374. }
  375.  
  376. int QLANG_T(int l) {
  377.   static int lng=0;
  378.   if (l>=0) {
  379.     lng=l;
  380.   }
  381.   return lng;  // 0=default (english)
  382. }
  383.  
  384.  
  385. /*
  386. char* LANGSEL(char* lang0,...) {
  387.   char* lang=lang0;
  388.   char* langalt="";
  389.   int langid=LANG_T(-1);
  390.   //
  391.   va_list argList;
  392.     va_start(argList, lang0);
  393.   while(langid>0) {
  394.     if (lang) {
  395.       if (strlen(langalt)==0) {
  396.         if (strlen(lang)>0)
  397.           langalt=lang;
  398.       }
  399.     }
  400.     langid--;
  401.     lang=va_arg(argList, char*);
  402.   }
  403.   va_end(argList);
  404.   //
  405.   if (!lang)
  406.     return langalt;
  407.   if (strlen(lang)==0)
  408.     return langalt;
  409.   return lang;
  410. }
  411. */
  412.  
  413. char* LANGSEL(char* name) {
  414.   unsigned long int adr=NULL;
  415.   if (NewLangStr)
  416.   if (!inthash_read(NewLangStr,name,(long int *)&adr))
  417.     adr=NULL;
  418.   if (adr) {
  419.     return (char*)adr;
  420.   }
  421.   return "";
  422. }
  423.  
  424. char* LANGINTKEY(char* name) {
  425.   unsigned long int adr=NULL;
  426.   if (NewLangStrKeys)
  427.   if (!inthash_read(NewLangStrKeys,name,(long int *)&adr))
  428.     adr=NULL;
  429.   if (adr) {
  430.     return (char*)adr;
  431.   }
  432.   return "";
  433. }
  434.  
  435.